<?php
/**
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	ssh\state
 * @category	ssh, state
 */
namespace rpo\ssh\state;

use rpo\base\exception\RuntimeException;
use rpo\ssh\interfaces\AbstractSSHState;
use rpo\ssh\interfaces\ISSHConnection;

/**
 * Implementa o estado para uma conexão autenticada
 * @author		João Batista Neto
 * @final
 * @package		rpo
 * @subpackage	ssh\state
 * @category	ssh, state
 */
final class SSHStateListen extends AbstractSSHState {
	/**
	 * @var resource
	 */
	private $shell;

	/**
	 * Executa um comando no servidor remoto
	 * @param string $command
	 * @param ISSHConnection $context
	 * @return string A saída do servidor remoto
	 * @throws RuntimeException se não for possível executar o comando
	 */
	public function execute( $command , ISSHConnection $context ){
		$ret = null;

		if ( !is_resource( $this->shell ) ){
			$this->shell = ssh2_shell( $this->resource ,  'xterm' );
		}

		$stream = ssh2_exec( $this->resource , $command );

		if ( is_resource( $stream ) ){
			stream_set_blocking( $stream , true );

			while ( ( $line = fgets( $stream , 4096 ) ) !== false ){
				$ret .= $line;
			}
		} else {
			throw new RuntimeException( 'Não foi possível executar o comando.' );
		}

		return $ret;
	}
}